package main

import "fmt"

// int 变量赋值
var i int

// 常量赋值
// 所谓常量，也就是在程序编译阶段就确定下来的值，而程序在运行时无法改变该值。
const Pi = 3.1415926

// Boolean 赋值，默认为 false
var booleanTest bool
var booleanTest2, booleanTest3 = true, false

// String 赋值
// Go中的字符串都是采用UTF-8字符集编码。字符串是用一对双引号（""）或反引号（` `）括起来定义
// 在Go中字符串是不可变的
var strTest string
var strTest2 string = ""

// 还可以这样写， 但是后面必须写 type
var (
	str1 string
	str2 string
	i2   int
)

// 在[n]type中，n表示数组的长度，type表示存储元素的类型
var arr [10]int

// ... 自动计算
var arr2 = [...]int{1, 3, 5, 2}

var easyArray = [2][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}}

// map[key]value 这种方式的声明需要在使用之前使用make初始化
var testMap map[string]string

// 另一种map生命方式
var testMap2 = make(map[string]int)

func main() {
	// 变量赋值 相当于 var vname1, vname2, vname3 type= v1, v2, v3
	// 不过它有一个限制，那就是它只能用在函数内部
	// 在函数外部使用则会无法编译通过，所以一般用var方式来定义全局变量。
	//vname1, vname2, vname3 := v1, v2, v3

	// 字符串拼接
	strTest3, strTest4 := "Im 3", "Im 4"
	strTest5 := strTest3 + strTest4
	fmt.Printf("%s\n", strTest5)

	// 字符串修改
	temp := []byte(strTest5) //将字符串转换为 byte
	temp[1] = 'b'
	strTest6 := string(temp)
	fmt.Printf("%s\n", strTest6)

	// 字符串修改-切片
	strTest6 = strTest6[4:len(strTest6)-2] + "6"
	fmt.Printf("%s\n", strTest6)

	// 换行 string
	var strEnter string = `
			   .-.			hello
			 __| |__
			[__   __]
			   | |
			   | |
			   | |
			   '-'			world`
	fmt.Printf("%s\n", strEnter)

	// 打印数组
	fmt.Printf("%d\n", arr2[2])
	fmt.Printf("%d\n", easyArray[1][3])
	fmt.Printf("%d\n", easyArray)

	// map
	testMap2["a"] = 1
	testMap2["b"] = 2
	fmt.Println("map打印: ", testMap2)
	// map也是一种引用类型，如果两个map同时指向一个底层，那么一个改变，另一个也相应的改变：
	testMap3 := testMap2
	testMap3["a"] = 3
	fmt.Println("改变后map的值: ", testMap2["a"])

	fmt.Printf("hello world!")
}
